<?php

require_once(FILE_DB_STATSTATISTIEKDATA);
require_once(FILE_DB_STATPERSOON);

/*
  --- PROJECT COFELY 20123, STATISTIEKENRAPPORT BEDRIJFSONDERDEEL --
  (was PROFITCENTER/BEDRIJF voor v2.0)
 * 
  @author: Leander Molegraaf
  @category: statistieken
  @name DbStatBedrijfsonderdeel

  @uses DbStatStatistiekData.php
  @uses DbStatPersoon.php
  @see DbStatStatistiek.php

  @version 2.0
  datum: 09-01-2012

  BESCHRIJVING:
  Deze klasse bevat alle gegevens van 1 bedrijfsonderdeel van 1 tijdsperiode, en een referentie naar alle individuele personen die bij de BO horen
  WERKING:
  Deze klasse wordt aangeroepen met 6 waardes:
  - de maand van het begin van de periode
  - de jaar van het begin van de periode
  - de maand van het einde van de periode
  - de jaar van het einde van de periode
  - de ID van het bedrijfonderdeel
  - de naam van het bedrijfsonderdeel

  met de functie selectGebruikersLijst wordt de public array $gebruikersLijst ingevuld. elke entry is 1 aparte persoon, en moet met een for loop worden uitgelezen

  CHANGELOG:
  2.0
  - profitcenter is bedrijfsonderdeel geworden
  - het attribuut WPIplichtig is default 12
  - 
  1.4.0:
  - SQL aangepast zodat het conform de nieuwe database indeling is.
  - als er wordt gefilterd op persoon, kan er ook worden gefilterd op persoon ID
  - als er niet wordt gefilterd op persoon, wordt er gekeken naar welke personen er in de filter periode
  bij deze bedrijfslaag hebben gewerkt. (1 persoon kan dus in meerder bedrijfslaags staan, met andere gegevens)

  1.3:
  - benaming verbeterd
  - testcode verwijderd
  - documentatie geupdate

  1.2.0:
  - comments geupdate
  - selectgebruikerslijst wordt nu aangeroepen vanuit de constructor, en is private
  - setData verwijzing voor een persoon gebeurd nu automatisch, en wordt niet meer in deze klasse aangeroepen
  - het onderdeel van selectGebruikerLijst dat de gegevens van elke gebruiker toevoegd aan de gegevens van deze PC
  is ondergeplaatst in de nieuwe functie fillClass.

  1.2.1:
  - filteren op persoon toegevoegd
 */

class DbStatBedrijfsonderdeel extends DbStatStatistiekData {

    
    public $gebruikersLijst; //array met DbStatpersoon objecten
    public $bedrijfslaagID, $WPIPlichtig; //int

    /**
     * constructor
     * @param int $beginFilterPeriodeMaand de maand vanaf wanneer gefilterd moet worden
     * @param int $beginFilterPeriodeJaar de jaar vanaf wanneer gefilterd moet worden
     * @param int $eindFilterPeriodeMaand de maand tot wanneer gefilterd moet worden
     * @param int $eindFilterPeriodeJaar de jaar tot wanneer gefilterd moet worden
     * @param int $bedrijfslaagID de ID van deze bedrijfslaag
     * @param String $naam de naam van de bedrijfslaag
     * @param String $formuliertype het type formulier(WPI/TBM)
     * @since Version 1.0
     */

    public function __construct($beginFilterPeriodeMaand, $beginFilterPeriodeJaar, $eindFilterPeriodeMaand, $eindFilterPeriodeJaar, $bedrijfslaagID, $naam, $formulierType) {
        parent::__construct();
        $this->setBeginFilterPeriodeJaar($beginFilterPeriodeJaar);
        $this->setEindFilterPeriodeJaar($eindFilterPeriodeJaar);
        $this->setBeginFilterPeriodeMaand($beginFilterPeriodeMaand);
        $this->setEindFilterPeriodeMaand($eindFilterPeriodeMaand);
        $this->setbedrijfslaagID($bedrijfslaagID);
        $this->setNaam($naam);
        $this->setFormulierType($formulierType);
        $persoon_registratienummer_list = $this->vulGebruikersLijst();
        $this->verwerkGebruikers($persoon_registratienummer_list);
    }

    public function getGebruikersLijst() {
        return $this->gebruikersLijst;
    }

    public function getBedrijfslaagID() {
        return $this->bedrijfslaagID;
    }

    public function setBedrijfslaagID($bedrijfslaagID) {
        $this->bedrijfslaagID = $bedrijfslaagID;
    }

    public function getWPIPlichtig() {
        return $this->WPIPlichtig;
    }

    public function setWPIPlichtig($WPIPlichtig) {
        $this->WPIPlichtig = $WPIPlichtig;
    }

    /**
     * vult de gebruikerslijst met DbStatPersoon objecten, en geeft ze de benodigde gegevens mee.
     * @name vulGebruikersLijst
     * @uses DbStatPersoon.php
     * @since Version 1.0
     * @return intarray $persoon_registratienummer_list een array met de registratienummers van alle gebruikers
     */
    private function vulGebruikersLijst() {

        if (isset($_POST['advsort']) && $_POST['advsort'] == 'persoon') {
            $query = "SELECT DISTINCT persoon_registratienummer FROM persoon_afdeling INNER JOIN persoon ON persoon_afdeling.persoon_registratienummer = persoon.registratienummer WHERE persoon_afdeling.bedrijfsonderdeel_id =" . $this->getbedrijfslaagID() . " AND (persoon.naam ='" . $_POST['sortData'] . "' OR persoon.registratienummer = '" . $_POST['sortData'] . "')"; 
            //als er op 1 persoon gefilterd wordt, pakt deze de gegevens van die ene persoon
        } else {
            $query = "SELECT DISTINCT persoon_registratienummer FROM persoon_afdeling WHERE bedrijfsonderdeel_id = " . $this->getBedrijfslaagID() . " ";
            //$query = "SELECT DISTINCT persoon_registratienummer FROM persoon_afdeling WHERE afdeling_id ='" . $this->getProfitcenterID() . "'";
            $query.= "AND ((begin_periode >= STR_TO_DATE('01/" . $this->getBeginFilterPeriodeMaand() . "/" . $this->getBeginFilterPeriodeJaar() . "', '%d/%m/%Y' ) AND einde_periode <= STR_TO_DATE( '01/" . $this->getEindFilterPeriodeMaand() . "/" . $this->getEindFilterPeriodeJaar() . "', '%d/%m/%Y' ))";
            $query.= " OR (begin_periode >= STR_TO_DATE( '01/" . $this->getBeginFilterPeriodeMaand() . "/" . $this->getBeginFilterPeriodeJaar() . "', '%d/%m/%Y' ) AND einde_periode > STR_TO_DATE( '01/" . $this->getEindFilterPeriodeMaand() . "/" . $this->getEindFilterPeriodeJaar() . "', '%d/%m/%Y' ))";
            $query.= " OR (begin_periode < STR_TO_DATE( '01/" . $this->getBeginFilterPeriodeMaand() . "/" . $this->getBeginFilterPeriodeJaar() . "', '%d/%m/%Y' ) AND einde_periode >= STR_TO_DATE( '01/" . $this->getEindFilterPeriodeMaand() . "/" . $this->getEindFilterPeriodeJaar() . "', '%d/%m/%Y' ))";
            $query.= " OR(begin_periode >= STR_TO_DATE( '01/" . $this->getBeginFilterPeriodeMaand() . "/" . $this->getBeginFilterPeriodeJaar() . "', '%d/%m/%Y' ) AND einde_periode IS NULL))";
            //echo('bedrijfsonderdeel query:<br />' . $query . '<br /><br />');

            /* deze query is nogal lang, en is daarom in 4 gedeeltes opgedeeld. de query haalt de registratienummers op van alle personen die binnen de filterperiode bij deze bedrijfslaag hebben gewerkt. hiervoor wordt de database persoon_afdeling gebruikt
             * hierin staat welke persoon op welk moment (via een begin_periode en eind_periode) bij welk bedrijfsonderdeel heeft gezeten
             * de tweede regel pakt alle mensen die hier al werkte voor het begin van de filterperiode, en die door de hele periode door zijn blijven werken (of gestopt zijn na het einde van de filterperiode)
             * de derde regel pakt alle mensen die al voor het begin van de filterperiode bij de afdeling werkte, maar die voor het einde van de filterperiode zijn gestopt, de laatste regel doet het omgekeerde.
             * 
             * de query moet mogelijk nog geoptimaliseerd worden
             */
        }
        if (!$this->dbQuery($query)) {
            $this->setError(STAT_ERROR_PERSOON_VULFOUT);
        }
        if ($this->checkDbErrors($query) == true) {
            echo(__FILE__ . __LINE__ . mysql_error());
        }

        return $persoon_registratienummer_list = $this->dbFetchAll();
    }

    /**
     * pakt de gegevens van alle personen in zijn array, en vult de gegevens van de eigen klasse daar mee in.
     * @name verwerkGebruikers
     * @param intarray $persoon_registratienummer_list een array met de registratienummers van alle gebruikers
     * @uses DbStatProfitcenter.php
     * @since Version 1.2.0
     * @return void
     */
    /* pakt de data van alle gebruikers die bij deze klasse hoort, en vult daarmee de klasse zelf. */
    private function verwerkGebruikers($persoon_registratienummer_list) {
        for ($nummer = 0; $nummer < count($persoon_registratienummer_list); $nummer++) {
            $this->gebruikersLijst[$nummer] = new DbStatpersoon($this->getBeginFilterPeriodeMaand(), $this->getBeginFilterPeriodeJaar(), $this->getEindFilterPeriodeMaand(), $this->getEindFilterPeriodeJaar(), $persoon_registratienummer_list[$nummer]['persoon_registratienummer'], $this->getFormulierType());

            if ($this->gebruikersLijst[$nummer]->getStatus() == 1) {
                $this->aantalGevolgd++;
            } else if ($this->gebruikersLijst[$nummer]->getStatus() == 2) {
                $this->aantalGemist++;
            } else {
                $this->aantalGemistMetReden++;
            }
            
            foreach($this->gebruikersLijst as $gebruiker){
                $this->WPIPlichtig += $gebruiker->getWPIplichtig();
            }
        }
    }
}
?>